package top.guoziyang.mydb.backend.vm;

import java.util.HashMap;
import java.util.Map;

import top.guoziyang.mydb.backend.tm.TransactionManagerImpl;

/**
 * vm对一个事务的抽象，用来保存快照数据
 */
public class Transaction {
    public long xid; //事务id
    public int level; //事务隔离级别
    public Map<Long, Boolean> snapshot; //事务快照,包含事务 t 开始时活跃的其他事务 ID，用于判断版本的可见性
    public Exception err;
    public boolean autoAborted; // 是否自动中止标记

    /**
     * 创建一个新事物实例
     */
    public static Transaction newTransaction(long xid, int level, Map<Long, Transaction> active) {
        Transaction t = new Transaction();
        t.xid = xid;
        t.level = level;
        // 如果隔离级别不为0,才创建事务快照
        if(level != 0) {
            t.snapshot = new HashMap<>();
            // 快照中存储所有活动事务的ID
            for(Long x : active.keySet()) {
                t.snapshot.put(x, true);
            }
        }
        return t;
    }

    /**
     * 判断指定事务ID是否在当前事务的快照中
     */
    public boolean isInSnapshot(long xid) {
        if(xid == TransactionManagerImpl.SUPER_XID) {
            return false;
        }
        return snapshot.containsKey(xid);
    }
}
